home *** CD-ROM | disk | FTP | other *** search
- #include <stdio.h>
- #include <limits.h>
- #include <stdarg.h>
-
- int _killsp(FILE *f)
- /* ueberspringt Leerzeichen */
- {
- int k,n=0;
- do{
- k=getc(f);n++;
- }while(isspace(k));
- ungetc(k,f);
- return(--n);
- }
-
- int _vfscanf(FILE *in,const char *fmt,va_list vl)
- {
- int k,n=0;
- while(k=*fmt){
- _killsp(in);
- if(k=='%'){
- int max,flags=0,i,*ip,base=0,c;
- char *str;unsigned int val,s=0;
- long *lp;short *sp;
- k=*++fmt;
- if(k>='0'&&k<='9'){
- max=0;
- while(k>='0'&&k<='9'){
- max=max*10+k-'0';
- k=*++fmt;
- }
- }else max=INT_MAX;
- if(k=='h'){flags|=2;k=*++fmt;}
- if(k=='l'||k=='L'){flags|=4;k=*++fmt;}
- fmt++;
- switch(k){
- default:
- case '%':
- c=getc(in);
- if(c!=k) {ungetc(c,in);return(n);}
- break;
- case 'c':
- str=va_arg(vl,char *);
- if((c=getc(in))==EOF) return(n);
- n++; *str=c;
- break;
- case 's':
- str=va_arg(vl,char *);
- i=0;
- do{
- c=getc(in);i++;
- *str++=c;
- }while(i<max&&!isspace(c)&&c!=EOF&&c!=0);
- if(isspace(c)||c==EOF||c==0){
- str--;ungetc(c,in);
- if(i==1) return(n);
- }
- *str=0;n++;
- break;
- case 'i':
- c=getc(in);
- if(c!='0'){
- ungetc(c,in);
- }else{
- flags|=16; /* unsigned */
- base=8;max--;
- c=getc(in);
- if(c!='x'&&c!='X') ungetc(c,in);
- else {max--;base=16;}
- }
- case 'u':
- if(!base) {base=10; flags|=16;}
- case 'x':
- case 'X':
- if(!base) {base=16; flags|=16;}
- case 'o':
- if(!base) {base=8; flags|=16;}
- case 'd':
- if(!base) base=10;
- if(flags&2) sp=va_arg(vl,short *);
- else{
- if(flags&4) lp=va_arg(vl,long *);
- else ip=va_arg(vl,int *);
- }
- val=0;
- c=getc(in);i=0;
- if(!(flags&16)&&c=='-'){max--;s=1;}else ungetc(c,in);
- while(1){
- int digit=-1;
- c=getc(in);
- if(c>='0'&&c<='9') digit=c-'0';
- if(c>='a'&&c<='f') digit=c-'a'+10;
- if(c>='A'&&c<='F') digit=c-'A'+10;
- if(digit<0||digit>(base-1)) {ungetc(c,in);break;}
- val=val*base+digit;i++;
- if(i>=max) break;
- }
- if(!i) return(n);
- if(flags&2){*sp=val;if(s) *sp=-*sp;}
- else{
- if(flags&4){*lp=val;if(s) *lp=-*lp;}
- else {*ip=val; if(s) *ip=-*ip;}
- }
- n++;
- break;
- }
- }else{
- int c;
- if(!isspace(k)){
- c=getc(in);
- if(c!=k) {ungetc(c,in);return(n);}
- }
- fmt++;
- }
- }
- return(n);
- }
-